Qries eduard-martinez

Qries @emartigo

Qries https://eduard-martinez.github.io

1 R y Rstudio

R es el lenguaje de programación y el motor de cálculo; RStudio es la interfaz gráfica que facilita trabajar con ese motor.

R (motor de cálculo)

  • Se distribuye como software libre mantenido por el R Core Team.
  • Incluye el intérprete que ejecuta las instrucciones en R, las bibliotecas base y una consola mínima.
  • Puede utilizarse de forma autónoma desde la terminal o integrarse en servidores y procesos automatizados (por ejemplo, cron jobs o scripts de producción).

RStudio (IDE)

  • Constituye un entorno de desarrollo integrado (IDE) creado por Posit (antes RStudio PBC) y se instala después de R, al que usa como motor subyacente.
  • Aporta un editor con resaltado de sintaxis, autocompletado y depuración; paneles para el entorno de objetos, archivos, gráficos, paquetes y ayuda; además de integración con Git/GitHub.
  • Agiliza tareas comunes como la generación de documentos reproducibles (R Markdown/Quarto), el desarrollo de aplicaciones Shiny o la gestión de proyectos de análisis de datos, todo desde una única ventana gráfica.

1.1 Interfaz de R

La consola constituye el espacio donde se introducen instrucciones y se observa de inmediato el resultado de la evaluación. Cada línea comienza con el símbolo de promp >; al pulsar Enter se ejecuta la instrucción y, debajo, se imprime el valor devuelto o un mensaje de advertencia o error según corresponda. En la parte superior se visualiza el historial de comandos, lo que permite reutilizar expresiones previas mediante las flechas del teclado o la función history().

1.2 Interfaz RStudio

RStudio abre, por defecto, una ventana dividida en cuatro paneles principales, cada uno asociado a una fase del flujo de trabajo:

1.2.1 Editor de scripts (arriba a la izquierda)

  • Permite redactar archivos R, R Markdown, Quarto, SQL, Python, etc.
  • Incluye resaltado de sintaxis, autocompletado, sangrado automático y marcadores.
  • El código seleccionado se envía a la consola con Ctrl + Enter; el script completo se ejecuta con Ctrl + Shift + S o mediante el botón Source.

1.2.2 Consola (abajo a la izquierda)

  • Ejecuta las instrucciones procedentes del editor o las escritas directamente.
  • Muestra resultados, advertencias (Warning), mensajes (Message) y errores (Error).
  • Conserva el historial de comandos, accesible con las flechas ↑/↓ o con history().

Después de ejecutar una línea de código en R, la consola puede retornar un decoding messages. Estos pueden ser: Warning o message: sugiere que hay detalles de la función que debemos tener en cuenta (no se detiene la ejecución de la función). Error: se genera cuando ocurrió un error importante causando que la función no continue ejecutándose.

1.2.3 Entorno / Historial (arriba a la derecha)

  • Environment registra los objetos creados durante la sesión (data frames, funciones, listas, etc.).
  • History conserva la secuencia de comandos ejecutados; desde allí pueden reenviarse a la consola o guardarse en un script.

1.2.4 Panel inferior (abajo a la derecha) — pestañas modulares

  • Files: navegación por el sistema de archivos del proyecto.
  • Plots: vista preliminar de gráficos generados (con opciones de exportación).
  • Packages: listado de bibliotecas instaladas y herramienta de actualización.
  • Help: documentación contextual (?función) y viñetas (vignette()).
  • Viewer: salida de aplicaciones Shiny, documentos HTML o visualizaciones interactivas.
  • Git / Terminal (si procede): integración con control de versiones y acceso a la línea de comandos.

2 Primeros pasos en R

Antes de trabajar con objetos en R, es útil familiarizarse con algunas operaciones básicas y cómo imprimir resultados en la consola. R permite ejecutar operaciones aritméticas, lógicas y de comparación de manera sencilla. A continuación, exploraremos estos conceptos clave.

2.1 Operaciones aritméticas

R reconoce los operadores aritméticos estándar:

Operador Descripción Ejemplo
+ Suma 3 + 2 # 5
- Resta 7 - 4 # 3
* Multiplicación 6 * 3 # 18
/ División 8 / 2 # 4
^, ** Exponenciación 2^3 # 8
%% Módulo (resto de división) 10 %% 3 # 1
%/% División entera 10 %/% 3 # 3
%*% Multiplicación matricial A %*% B
%o% Producto exterior x %o% y
%x% Producto Kronecker A %x% B

Ejemplo de operaciones básicas:

1 + 2  # Suma
## [1] 3
5 / 2  # División
## [1] 2.5
(2 + 4) * 1^3  # Uso de paréntesis para controlar la precedencia
## [1] 6

Orden de precedencia en operaciones aritméticas en R: 1. ^ (exponentes) 2. * y / (multiplicación y división) 3. + y - (suma y resta)

Ejemplo de precedencia:

3 + 2 * 4  # Multiplicación antes de la suma (resultado: 11)
## [1] 11
(3 + 2) * 4  # Uso de paréntesis para cambiar precedencia (resultado: 20)
## [1] 20

2.1.1 División entera y módulo

100 %/% 60  # ¿Cuántas horas enteras hay en 100 minutos?
## [1] 1
100 %% 60   # ¿Cuántos minutos quedan?
## [1] 40

2.1.2 Operadores lógicos

R incluye operadores lógicos para evaluar condiciones:

Operador Descripción Ejemplo
< , > Menor y mayor que 5 > 3 # TRUE
<= , >= Menor o igual y mayor igual que 5 >= 5 # TRUE
== Igual a 3 == 3 # TRUE
!= Diferente de 3 != 4 # TRUE
& y (AND lógico) TRUE & FALSE # FALSE
| o (OR lógico) TRUE | FALSE # TRUE
! Negación lógica !TRUE # FALSE

Ejemplo de evaluación lógica:

1 > 2  # ¿Es 1 mayor que 2?
## [1] FALSE
1 > 2 & 1 > 0.5  # ¿Es 1 mayor que 2 y mayor que 0.5?
## [1] FALSE
1 > 2 | 1 > 0.5  # ¿Es 1 mayor que 2 o mayor que 0.5?
## [1] TRUE
isTRUE(1 < 2)  # Devuelve TRUE si la condición es cierta
## [1] TRUE

Precaución con la precedencia:
Los operadores relacionales (>, ==) se evalúan antes que los operadores booleanos (&, |).

1 > 0.5 & 2  # ¿Qué pasa aquí?
## [1] TRUE

Para evitar confusión, siempre compare valores explícitamente:

1 > 0.5 & 1 > 2  # Evaluación correcta
## [1] FALSE

2.1.3 Evaluación de pertenencia con %in%

Para verificar si un elemento está contenido en un conjunto, usamos %in%:

4 %in% 1:10  # ¿Está 4 en la secuencia del 1 al 10?
## [1] TRUE
4 %in% 5:10  # ¿Está 4 en la secuencia del 5 al 10?
## [1] FALSE

También podemos evaluar igualdad con ==:

2.1.4 Advertencia sobre números de coma flotante

0.1 + 0.2 == 0.3  # ¿Esperas que sea TRUE?
## [1] FALSE

Problema: Las computadoras representan números en base 2, lo que puede generar errores de precisión. Más información en este enlace.

Solución: Para comparar valores decimales, usa all.equal() en lugar de ==:

all.equal(0.1 + 0.2, 0.3)  # Evalúa correctamente
## [1] TRUE

3 Librerías

3.1 Acerca de las librerías:

  • Las librerías son un conjunto/paquete de funciones especializadas en tareas específicas.

  • Una librería se debe instalar en el equipo solo una vez -install.packages()-, pero se debe llamar/requerir -library() o require()- cada vez que se inicia una sesión de Rstudio en la que se va a utilizar alguna función de esa librería.

  • Algunas librerías se actualizan constantemente, usted puede actualizar la versión de una librería usando la función update.packages().

Nota: puede inspeccionar las librerías que tiene activas en su sesión corriendo la función sessionInfo() sobre la consola de R:

## información de la sesión
sessionInfo()
R version 4.3.1 (2023-06-16)
Platform: x86_64-apple-darwin20 (64-bit)
Running under: macOS Monterey 12.6.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base   

3.2 ¿Cómo gestionar las librerías en R?

Cuando inicia sesión, R carga 7 librerías bases (usted,stats,graphics,grDevices,utils, datasets, methods y base). Pero usted puede instalar/llamar cerca de 22498 librerías disponibles en el CRAN de R.

¿Como instalar/actualizar una librería?

4 Funciones y help

4.1 Funciones

Una función permite crear, editar, transformar o eliminar objetos. Están contenidas en librerías. Y cada función contiene por lo menos 1 argumento.

NOTA: Toda función abre con ( y debe cerrar con un ). Aseguresé de ejecutar la función así, para que R entienda hasta que punto debe ejecutar esa funcíon.

4.2 Obtener ayuda de una función

Para obtener más información sobre una función u objeto (con nombre) en R, consulte la documentación de “help” o usando ?:

help(rnorm)
?rnorm 

Hint: Los comentarios en R están delimitados por #. Presiona Ctrl+Shift+c en RStudio para (des)comentar secciones completas del código resaltado.

Hint: ¿Ves la sección Ejemplos en la parte inferior del archivo de ayuda? Puedes ejecutarlos con la función example().

example(rnorm)

4.3 Vignettes

Para muchos paquetes, también puede probar la función vignette(), que proporcionará una introducción a un paquete y su propósito a través de una serie de ejemplos útiles. Una complicación es que necesita saber el nombre exacto de la(s) viñeta(s) del paquete. Intente ejecutar:

vignette("base")

4.4 Demos

Al igual que las viñetas, muchos paquetes vienen con demostraciones interactivas integradas. Para enumerar todas las demostraciones disponibles en su sistema:

demo("graphics", package = "graphics")
demo(package = .packages(all.available = TRUE))

5 Orientado a objetos

5.1 Asignar objetos

Para asignar un objeto se debe seguir la siguiente estructura:

nombre_objeto + asignar + funcion()

# Una forma de hacerlo: 
data_1 <- rnorm(n = 10 , mean = 50 , sd = 10)

# Otra forma de hacerlo: 
data_2 = rnorm(n = 10 , mean = 40 , sd = 10)

¿Qué operador de asignación usar?

La mayoría de los usuarios de R (¿puristas?) parecen preferir <- para la asignación, ya que = también tiene un papel específico para la evaluación dentro de las funciones.

  • Veremos muchos ejemplos de esto más adelante.

  • Pero no creo que importe; = es más rápido de escribir y es más intuitivo si vienes de otro lenguaje de programación. (Más discusión aquí)

Conclusión: Usa lo que prefieras. Solo sé consistente dentro de tu propio código. i.e: Usa el mismo operador en la medida de lo posible.

También puede asignar objetos usando la siguiente estructura:

x1 <- 2 + 2
x1
## [1] 4
assign("x2", 3/6)
x2
## [1] 0.5
3*4 -> x3
x3
## [1] 12

5.2 ¿Qué es un objeto?

Es importante enfatizar que hay muchos tipos (o clases) diferentes de objetos.

Volveremos a examinar el tema de “tipo” frente a “clase” en una o dos diapositivas. Por el momento, es útil simplemente nombrar algunos objetos con los que trabajaremos regularmente:

  • vectores
  • matrices
  • dataframes
  • listas
  • funciones
  • etc.

Cada clase de objeto tiene su propio conjunto de reglas (“métodos”) para determinar operaciones válidas. Por ejemplo, aunque hay operaciones que funcionan en matrices y dataframes, también hay algunas operaciones que solo funcionan en una matriz, y viceversa. Al mismo tiempo, puede (generalmente) convertir un objeto de un tipo a otro.

## Crea un dataframe llamado "df".
df = data.frame(x = 1:2, y = 3:4)
df
##   x y
## 1 1 3
## 2 2 4
## Convertirlo en una matriz "mt".
mt = as.matrix(df)
mt

Puede inspeccionar/imprimir un objeto directamente en la consola debe escribir df en la consola o puede usar la función View(df) para verlo en el editor de datos.

5.3 Clase, tipo y estructura

Usar class, typeof, y str para conocer más acerca de un objeto.

class(df) ## Evaluate its class.
## [1] "data.frame"
typeof(df) ## Evaluate its type.
## [1] "list"
str(df) ## Show its structure.
## 'data.frame':    2 obs. of  2 variables:
##  $ x: int  1 2
##  $ y: int  3 4

5.4 Todo tiene un ‘nombre’

Podemos asignar objetos a diferentes nombres. Sin embargo, hay una serie de palabras especiales que están “reservadas” en R. Estos son comandos, operadores y relaciones fundamentales en base R que no se pueden (re)asignar (aunque se quisiera). Consulte una lista completa aquí.

Algunas de las palabras que no se pueden usar:

if 
else 
while 
function 
for
TRUE 
FALSE 
NULL 
Inf 
NaN 
NA 

Además de la lista de palabras estrictamente reservadas, existe otro conjunto de palabras que, aunque se reasignar pero que es mejor no usarlas.

Por ejemplo: c() se usa para concatenar; es decir, crear vectores y unir diferentes objetos.

c = 4
c(1, 2, 5)

Afortunadamente nada. R es lo suficientemente “inteligente” para distinguir entre la variable c = 4 que creamos y la función integrada c() que requiere concatenación.

¿Qué pasa si usamos comillas para nombrar un objeto?

"hola" = 2
hola

5.5 ¿Workspace?

El espacio de trabajo es la colección de objetos almacenados en la memoria activa de R. Para gestionar el espacio de trabajo puede:

objects() ## ver objetos en el espacio de trabajo
## [1] "df"     "my_tbl" "x1"     "x2"     "x3"
object.size(mtcars) ## peso de un objeto
## 7208 bytes
ls() ## ver objetos en el espacio de trabajo
## [1] "df"     "my_tbl" "x1"     "x2"     "x3"

Puede remover uno o varios objetos del espacio de trabajo:

rm() ## remover un objeto del espacio de trabajo
rm(list=ls()) ## Limpiar el entorno de trabajo
cat("\f") ## Limpiar la consola
save.image("~/Clase-02.RData") ## Guardar espacio de trabajo

6 Tipos de datos

En R puede encontrar distintos tipos de datos. Los más comunes son los datos numéricos, texto y lógicos.

6.1 Numérico y texto

# Numericos
is.numeric(10)
## [1] TRUE
# Las cadenas de caracteres se escriben entre " " o entre ''
is.character("Hola")
## [1] TRUE
is.numeric("10")
## [1] FALSE

6.2 Lógicos

# Lógicos (TRUE,FALSE,NA,NULL)
is(TRUE)
## [1] "logical" "vector"
is(Inf)
## [1] "numeric" "vector"
is(NULL)
## [1] "NULL"             "OptionalFunction" "optionalMethod"

7 Vectores y matrices

Los vectores y las matrices son objetos homogéneos. Es decir, todos los elementos de estos objeto deben ser del mismo tipo (numérico o carácter o lógico). Sim embargo, mientras los vectores son de una dimensión las matrices tienen dos dimensiones (filas y columnas).

7.1 Vectores: Indexación

La indexación en R comienza en 1. No 0 como en algunos lenguajes (por ejemplo, Python y JavaScript). Podemos usar [] para indexar objetos que creamos en R.

a = c(10 , 20 , 30 , 40 , 50 , 60)

a[4] # obtener el cuarto elemento del objeto "a"
## [1] 40
a[2:3] # maneter elementos de la posición 2 a la 3
## [1] 20 30
a[-3] # eliminar el tercer elemento
## [1] 10 20 40 50 60

7.2 Vectores: extraer valores

Usando operadores lógicos o aritméticos

x = c(NA,1,2,3,4,5,NA)

x[!is.na(x)] # Diferentes de NA
## [1] 1 2 3 4 5
x[x>3] # Mayores a 3 (Ojo con los NA)
## [1] NA  4  5 NA
x[x %in% 1:3] # Contenidos en 1 a 3
## [1] 1 2 3

7.3 Vectores: atributos

length(x) # largo del vector
## [1] 7
class(x) # clase
## [1] "numeric"
str(x) # estructura del dato
##  num [1:7] NA 1 2 3 4 5 NA
object.size(x) # tamaño
## 112 bytes

7.4 Vectores: numéricos

x <- c(1 , 2 , 3 , 4 , 5)
is.numeric(x)
## [1] TRUE

Generar secuencias regulares:

x = 1:5
x
## [1] 1 2 3 4 5
x1 = seq(-5, 5, by=2)
x1
## [1] -5 -3 -1  1  3  5
x2 <- rep(x, times=5)
x2
##  [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
x3 <- rep(x, each=5)
x3
##  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5

7.5 Vectores: Operaciones aritméticas

Algunos operadores que se pueden aplicar: +, -, *, /, ^, sum(), mean(), min()

sum(x) ; length(x) ; prod(x) ; mean(x)
## [1] 15
## [1] 5
## [1] 120
## [1] 3

7.6 Vectores: lógicos

logi = c(TRUE,NA,FALSE,NULL)
logi
## [1]  TRUE    NA FALSE
# aplicar un operador
logi = 1:5 >= 3
logi
## [1] FALSE FALSE  TRUE  TRUE  TRUE

¿Cuál es la diferencia entre NA, NaN y NULL?

x = c(1:3,NA,0/0,NULL,Inf,-Inf)
x
## [1]    1    2    3   NA  NaN  Inf -Inf
is.na(x)
## [1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
is(0/0)
## [1] "numeric" "vector"

7.7 Vectores: Caracteres

Puede usarse " o ' para escribir una cadena de caracteres en R:

x = c("Hola-","Mundo-","10-")
x
## [1] "Hola-"  "Mundo-" "10-"

Pueden concatenarse cadenas de caracteres usando la función paste() o paste0()

y = paste(x, 1:5, sep = "")
y
## [1] "Hola-1"  "Mundo-2" "10-3"    "Hola-4"  "Mundo-5"

8 Matrices

8.0.1 8.1. Matrices: Numéricas

x = matrix(data = 1:9 , nrow=3 , ncol=3)
x
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

8.0.2 8.2. Matrices: Caracteres

y = matrix(data = c("hola","mundo") , nrow=2 , ncol=2)
y
##      [,1]    [,2]   
## [1,] "hola"  "hola" 
## [2,] "mundo" "mundo"

8.0.3 8.3. Matrices: Atributos

attributes(x) # atributos
## $dim
## [1] 3 3
class(x) # clase
## [1] "matrix" "array"
str(x) # tipo de dato
##  int [1:3, 1:3] 1 2 3 4 5 6 7 8 9

8.0.4 8.4. Matrices: Indexación

Las matrices tienen dos dimensiones [i,j], siendo i y j la la i-ésima fila y j-ésima la columna respectivamente.

x[1,] # Obtener la fila 1
## [1] 1 4 7
x[,3] # Obtener la columna 3
## [1] 7 8 9
x[2,2] # Obtener elemento de la fila y columna 2
## [1] 5

8.0.5 8.5. Matrices: reemplazar valores

x[x<4] = NA
x
##      [,1] [,2] [,3]
## [1,]   NA    4    7
## [2,]   NA    5    8
## [3,]   NA    6    9

8.1 9. Dataframes

Los dataframes son objetos heterogéneos de dos dimensiones. Es decir, puede almacenar elementos de diferentes tipos (numéricos, caracteres y lógicos al mismo tiempo) y tiene dos dimensiones (filas y columnas).

8.1.1 9.1 Importar dataframe

Conjuntos de datos disponibles en la memoria de R

data(package="datasets")
Data sets in package ‘datasets’:

iris                            Edgar Anderson´s Iris Data
iris3                           Edgar Anderson´s Iris Data
islands                         Areas of the World´s Major Landmasses
ldeaths (UKLungDeaths)          Monthly Deaths from Lung Diseases in the UK
lh                              Luteinizing Hormone in Blood Samples
longley                         Longley´s Economic Regression Data
lynx                            Annual Canadian Lynx trappings 1821-1934
mdeaths (UKLungDeaths)          Monthly Deaths from Lung Diseases in the UK
morley                          Michelson Speed of Light Data
mtcars                          Motor Trend Car Road Tests
uspop                           Populations Recorded by the US Census
volcano                         Topographic Information on Auckland´s Maunga Whau Volcano
women                           Average Heights and Weights for American Women

Se muestran solo algunos de los 104 conjuntos de datos disponibles en la librería datasets.

df = as.data.frame(mtcars) 
df
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

En las próximas clases aprenderemos a crear dataframes importando a R conjuntos de datos desde nuestros equipos (.csv, .xlsx, .txt,…).

8.1.2 9.2 Atributos un dataframe

colnames(df) # acceder a los nombres de las variables/columnas
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
attributes(df) # Ver atributos
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"
dim(df) # dimensiones
## [1] 32 11
str(df) # Estructura
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

8.1.2.1 9.3.1. Indexación

Los dataframes tienen dos dimensiones [i,j], siendo i y j la la i-ésima fila y j-ésima la columna respectivamente.

df[1,] # Obtener la fila 1
##           mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
df[,3] # Obtener la columna 3
##  [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8
## [13] 275.8 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1 318.0 304.0 350.0
## [25] 400.0  79.0 120.3  95.1 351.0 145.0 301.0 121.0
df[2,2] # Obtener elemento de la fila y columa 2
## [1] 6

8.1.2.2 9.3.2 Acceder a las columnas/variables:

df$wt
##  [1] 2.620 2.875 2.320 3.215 3.440 3.460 3.570 3.190 3.150 3.440 3.440 4.070
## [13] 3.730 3.780 5.250 5.424 5.345 2.200 1.615 1.835 2.465 3.520 3.435 3.840
## [25] 3.845 1.935 2.140 1.513 3.170 2.770 3.570 2.780
df[,1]
##  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4

8.1.2.3 9.3.3 Maneter/remover filas y/o columnas

df[1,] # Obtener primera fila
##           mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
df[1:3,1:4] # Obtener las primeras 4 filas/columnas
##                mpg cyl disp  hp
## Mazda RX4     21.0   6  160 110
## Mazda RX4 Wag 21.0   6  160 110
## Datsun 710    22.8   4  108  93

Remover de la fila 1 a la fila 10

x = df[-1:-10,] # Remover primeras 10 filas
x
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

8.1.3 9.4. tibble() o data.frame()

vignette("tibble")
## Tibbles

Tibbles are a modern take on data frames. They keep the features that have stood 
the test of time, and drop the features that used to be convenient but are now 
frustrating (i.e. converting character vectors to factors).

...

## Tibbles vs data frames
There are three key differences between tibbles and data frames: printing, 
subsetting, and recycling rules.

Es más eficiente (computacionalmente) trabajar con objetos tbl

tb = tibble::as_tibble(df)
class(tb)
## [1] "tbl_df"     "tbl"        "data.frame"
tb
## # A tibble: 32 × 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## # ℹ 22 more rows

8.2 10. Listas

Las listas son objetos heterogéneos de una dimensión. Es decir, en una lista se puede almacenar diferentes tipos de objetos (vectores, matrices, dataframes y listas) pero al igual que los vectores tienen solo una dimensión (fila o columna).

8.2.1 10.1 Generar lista

lista = list("tibble_1"=tb[1:5,],
             "tibble_2"=tb[6:10,]) # Asignar nombre a cada posición dentro de la lista
lista[[3]] = tb[11:nrow(tb),] # Almacenar en la tercera posición
lista
## $tibble_1
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
## 
## $tibble_2
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
## 2  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
## 3  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
## 4  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 5  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## 
## [[3]]
## # A tibble: 22 × 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  17.8     6 168.    123  3.92  3.44  18.9     1     0     4     4
##  2  16.4     8 276.    180  3.07  4.07  17.4     0     0     3     3
##  3  17.3     8 276.    180  3.07  3.73  17.6     0     0     3     3
##  4  15.2     8 276.    180  3.07  3.78  18       0     0     3     3
##  5  10.4     8 472     205  2.93  5.25  18.0     0     0     3     4
##  6  10.4     8 460     215  3     5.42  17.8     0     0     3     4
##  7  14.7     8 440     230  3.23  5.34  17.4     0     0     3     4
##  8  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
##  9  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
## 10  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
## # ℹ 12 more rows

8.2.2 10.2 Atributos

length(lista) # dimensiones
## [1] 3
names(lista) # nombres de los elementos
## [1] "tibble_1" "tibble_2" ""
names(lista)[3] = "tibble_3" # Asignar nombre al elemento 3
attributes(lista) # Ver atributos
## $names
## [1] "tibble_1" "tibble_2" "tibble_3"

8.2.3 10.3. Indexación

La indexación en las listas requiere dos [[]]

lista[[4]] = letters
head(lista)  
## $tibble_1
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
## 
## $tibble_2
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
## 2  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
## 3  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
## 4  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 5  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## 
## $tibble_3
## # A tibble: 22 × 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  17.8     6 168.    123  3.92  3.44  18.9     1     0     4     4
##  2  16.4     8 276.    180  3.07  4.07  17.4     0     0     3     3
##  3  17.3     8 276.    180  3.07  3.73  17.6     0     0     3     3
##  4  15.2     8 276.    180  3.07  3.78  18       0     0     3     3
##  5  10.4     8 472     205  2.93  5.25  18.0     0     0     3     4
##  6  10.4     8 460     215  3     5.42  17.8     0     0     3     4
##  7  14.7     8 440     230  3.23  5.34  17.4     0     0     3     4
##  8  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
##  9  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
## 10  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
## # ℹ 12 more rows
## 
## [[4]]
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"

8.2.3.1 10.3.1 Remover un elemento

lista = lista[-4]
head(lista)
## $tibble_1
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
## 
## $tibble_2
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
## 2  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
## 3  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
## 4  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 5  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## 
## $tibble_3
## # A tibble: 22 × 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  17.8     6 168.    123  3.92  3.44  18.9     1     0     4     4
##  2  16.4     8 276.    180  3.07  4.07  17.4     0     0     3     3
##  3  17.3     8 276.    180  3.07  3.73  17.6     0     0     3     3
##  4  15.2     8 276.    180  3.07  3.78  18       0     0     3     3
##  5  10.4     8 472     205  2.93  5.25  18.0     0     0     3     4
##  6  10.4     8 460     215  3     5.42  17.8     0     0     3     4
##  7  14.7     8 440     230  3.23  5.34  17.4     0     0     3     4
##  8  32.4     4  78.7    66  4.08  2.2   19.5     1     1     4     1
##  9  30.4     4  75.7    52  4.93  1.62  18.5     1     1     4     2
## 10  33.9     4  71.1    65  4.22  1.84  19.9     1     1     4     1
## # ℹ 12 more rows

8.2.3.2 10.3.2 Subset elmentos:

lista[[1]] # usando la posición del elemento
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
lista[[1]][,"mpg"] # dentro del objeto
## # A tibble: 5 × 1
##     mpg
##   <dbl>
## 1  21  
## 2  21  
## 3  22.8
## 4  21.4
## 5  18.7
lista[["tibble_1"]] # Usando el nombre del elemento
## # A tibble: 5 × 11
##     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1  21       6   160   110  3.9   2.62  16.5     0     1     4     4
## 2  21       6   160   110  3.9   2.88  17.0     0     1     4     4
## 3  22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
## 4  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
## 5  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2

8.2.4 10.4. Apilar los elementos de una lista:

tbl = data.table::rbindlist(l = lista , use.names = T)
head(tbl)
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
## 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
## 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
## 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
## 4:  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
## 5:  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2
## 6:  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1
class(tbl)
## [1] "data.table" "data.frame"

8.3 [11.] Directorio de trabajo

8.3.1 11.1 ¿Qué es un directorio de trabajo?

Es nuestra manera de decirle a R, donde debería buscar los datos que vamos a necesitar.

8.3.2 11.2 ¿Cómo gestionar el directorio de trabajo?

Puede pintar sobre la consola de r la ubicación del directorio de trabajo y los archivo almacenados en e directorio de trabajo:

## obtener ruta al repositorio actual
getwd() 
## [1] "/Users/eduardmartinez/Library/CloudStorage/Dropbox/Teaching/Recursos R/intro-r"
## ver archivos en el directorio de trabajo
list.files() 
## [1] "images"     "index.html" "index.Rmd"  "input"      "pics"      
## [6] "proj.Rproj" "styles.css"

Puede cambiar el directorio de trabajo usando la función setwd():

setwd("escribir aquí la ruta al nuevo directorio de trabajo")

8.3.3 11.3 ¿Qué son los proyectos?

Los proyectos son una manera alternativa de lidiar con la ruta de trabajo. Los proyectos permiten empaquetar datos y código en una especie de contenedor en el que se fija un directorio de trabajo relativo a cada equipo; haciendo más sencillo el proceso lectura y escritura de datos.

8.3.4 11.4 ¿Cómo crear un proyecto?

Puede crear un proyecto desde cero o puede asociar una carpeta existente a un proyecto:

8.3.5 11.5 Abrir un proyecto

Cuándo se abre el archivo .Rproj automáticamente Rstudio establece como directorio de trabajo la carpeta que contiene el archivo .Rproj.

8.3.6 11.6 Ejercicio en clase:

1. Descargue el archivo Week-03

2. Descomprima el archivo en su equipo.

3. Cree un proyecto en R que contenga y nombre la carpeta como desee.

4. Imprima sobre la consola de R la función getwd() para ver directorio de trabajo.

8.4 [12.] Importar-exportar conjuntos de datos

8.4.1 12.1 Librería rio

rio es una librería que simplifica el proceso de importar, exportar y/o convertir bases de datos desde múltiples extensiones.

File_type Importar Exportar
.csv import() export()
.txt import() export()
.xls, .xlsx import() export()
.dta import() export()
rds import() export()

Esta función utiliza los mismos argumentos para diferentes formatos.

  • file = “” Dirección de directorio

  • sep = Separador de columnas (en .csv y .txt)

  • skip = Desde cuál fila leer la base de datos

  • sheet = Cuál hoja leer

  • header = T/F Nombres de las columnas en primera fila

  • skipNul = T/F Se debe aceptar los no elementos.

8.4.2 12.2 Importar

Leer desde un formato .csv:

data_csv = import(file="input/datos censo colombia.csv" , skip=6 , encoding="UTF-8") 
##   codigo_divipola NOMBRE DEPARTAMENTO poblacion_en_hogares poblacion_en_lea
## 1              00      Total Nacional             43835324           329093
## 2              05           Antioquia              5931492            43296

Leer desde un formato .xlsx

data_xls = import(file="input/poblacion dane.xlsx" , skip=9)
##   DEPARTAMENTO    MUNICIPIO   MES                ARMAS MEDIOS
## 1     AMAZONAS LETICIA (CT) ENERO ARMA BLANCA / CORTOPUNZANTE
## 2     AMAZONAS LETICIA (CT) MARZO ARMA BLANCA / CORTOPUNZANTE

Leer desde una url en internet:

data_url = import(file="https://www.datos.gov.co/resource/8dar-v8rj.json")

8.4.3 12.3 Exportar

8.4.3.1 Exportar a un formato .csv

export(x=data_url, file="output/datos censo magdalena.csv")

8.4.3.2 Exportar a un formato .xlsx

export(x=data_url , file="output/datos censo magdalena.xlsx")

8.4.3.3 Indiquemos en que formato se debe de exportar .rds, .xlsx, …

export(x=data_url , file="output/datos censo magdalena.rds")

8.4.4 12.4 Convertir

convert() es la combinación de las funciones import() y export(), ya que permite cambiar la extensión de un archivo sin la necesidad de crear un objeto en R

convertir .csv -> .xlsx

convert(in_file = "input/datos censo colombia.csv" , out_file="output/datos censo colombia.xlsx")

convertir .xlsx -> .rds

convert(in_file="input/poblacion dane.xlsx" , out_file="output/poblacion dane.rds")

8.4.5 12.5 ¿Qué formato usar?

.rds es hasta 16 veces más eficiente que el formato .csv.

8.5 13. Referencias

  • W. N. Venables, D. M. Smith, 2021. An Introduction to R [Ver aquí]

    • Cap. 2: Simple manipulations; numbers and vectors
    • Cap. 3: Objects, their modes and attributes
    • Cap. 5: Arrays and matrices
    • Cap. 6: Lists and data frames
  • Colin Gillespie and Robin Lovelace, 2017. Efficient R Programming, A Practical Guide to Smarter Programming [Ver aquí]

    • Cap. 4: Efficient Workflow
    • Cap. 5: Efficient input/output